﻿using ConfigProj.Define;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;

namespace ConfigProj
{
    public class Rootobject
    {
        public string[] exclude { get; set; }
        public Mysql mysql { get; set; }
        public Shopidlist[] shopidlist { get; set; }
    }

    public class Mysql
    {
        public string host { get; set; }
        public int port { get; set; }
    }

    public class Shopidlist
    {
        public int entid { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<KeyValuePair<string, string>> kvPairs = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string>("username","xiaoqiang"),
                new KeyValuePair<string, string>("age","25")
            };


            var env = Environment.GetEnvironmentVariable("WebConfig") ?? "Debug";

            //nuget Microsoft.Extensions.Configuration

            var config = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)

                // Microsoft.Extensions.Configuration.Json
                .AddJsonFile("jsconfig.json")

                //字典方式配置
                .AddInMemoryCollection(kvPairs)

                // Microsoft.Extensions.Configuration.Xml
                .AddXmlFile("appsettings.xml")

                 //Microsoft.Extensions.Configuration.EnvironmentVariables
                 //系统配置文件
                 .AddEnvironmentVariables()

                 //通过系统环境 变量 动态加载不同的配置文件数据
                 .AddXmlFile($"Web.{env}.config")

                 //自定义配置
                 .AddPropertiesFile("db.properties")

                .Build();


            {//读取数组

                //返回 null,不能直接返回 数组
                var excludes = config.GetSection("exclude").Value;

                //正常读取1 ，一个一个读取
                var arrExclude = config.GetSection("exclude").GetChildren();
                foreach (var item in arrExclude)
                {
                    Console.WriteLine(item.Value);
                }

                //正常读取2 使用 Get 泛型，引入 Microsoft.Extensions.Configuration.Binder
                var arrExclude2 = config.GetSection("exclude").Get<string[]>();



                //对json文件内容，选择性粘贴，得到 Rootobject，得出泛型的配置类对象
                var rootObj = config.Get<Rootobject>();


                //字典索引的方式 获取
                var port = config["mysql:port"];

                //泛型形式获取，获取某个值用 GetValue ,可以指定默认值
                var port2 = config.GetValue<int>("mysql:port", -1);


                //方式1：获取数组中的第 x 索引的值
                var val = config["exclude:1"];
                //方式2
                var val2 = config.GetSection("exclude").GetSection("1").Value;


                //多个配置中包含 username ，哪个最后，取哪个
                var username = config.GetSection("username").Value;


                //通过系统环境 变量 动态加载不同的配置文件数据，获取数据
                var mysql = config.GetSection("MySql").Value;


                //java项目的properties配置文件解析： 从 db.properties 文件中读取
                var url = config.GetSection("jdbc.url").Value;


            }

        }
    }
}
